package com.dys.teststreamapi11;

import com.dys.testlambda02.entity.Person;

import java.util.stream.Stream;

/**
 * @className: com.dys.teststreamapi11.StreamAPITest
 * @description: Stream流的函数拼接：map、sorted、distinct
 * @author: pine cone
 * @version: v1.0.0
 * @createTime: 2024/09/01 下午4:39
 */
public class StreamAPITest05 {
    /**
     * 这是一个main()方法,是应用程序的入口
     *
     * @param args 方法的形参列表,是一个字符串数组,包含了从命令行传递给程序的参数
     */
    public static void main(String[] args) {
        streamDistinct2();
    }

    /**
     * 终结方法：遍历的方法
     */
    private static void streamForeach() {
        Stream.of("a1", "a2", "a3", "a4", "a5", "a6", "a7").forEach(System.out::println);
    }

    /**
     * 终结方法：统计流中的个数
     */
    private static void streamCount() {
        long count = Stream.of("a1", "a2", "a3", "a4", "a5", "a6", "a7").count();
        System.out.println(count);
    }

    /**
     * 过滤方法
     */
    private static void streamFilter() {
        Stream.of("a1", "a2", "a3", "aa", "bb", "cc", "dd").filter(s -> s.contains("a")).forEach(System.out::println);
    }

    /**
     * limit方法可以对流进行截取处理，支取前n个数据
     * 参数是一个long类型的数值，如果集合当前长度大于参数就进行截取，否则不操作：
     */
    private static void streamLimit() {
        Stream.of("a1", "a2", "a3", "aa", "bb", "cc", "dd").limit(5).forEach(System.out::println);
    }

    /**
     * 跳过前面几个元素，可以使用skip方法获取一个截取之后的新流：
     */
    private static void streamSkip() {
        Stream.of("a1", "a2", "a3", "aa", "bb", "cc", "dd").skip(3).forEach(System.out::println);
    }

    /**
     * 将流中的元素映射到另一个流中，可以使用map方法
     */
    private static void streamMap() {
        // Stream.of("1","2","4","3","6","7").map(s->Integer.parseInt(s)).forEach(System.out::println);
        Stream.of("1", "2", "4", "3", "6", "7").map(Integer::parseInt).forEach(System.out::println);
    }

    /**
     * 将数据排序，可以使用sorted方法：
     */
    private static void streamSorted() {
        Stream.of("1", "2", "4", "3", "6", "7")
                .map(Integer::parseInt)
                // .sorted() // 默认升序
                .sorted((o1, o2) -> o2 - o1)
                .forEach(System.out::println);
    }

    /**
     * 如果要去掉重复数据，可以使用distinct方法：
     */
    private static void streamDistinct() {
        Stream.of("1", "2", "4", "3", "6", "7", "3")
                .map(Integer::parseInt)
                .sorted() // 默认升序
                .distinct() // 去掉重复的数据
                .forEach(System.out::println);
    }

    /**
     * Stream流中的distinct方法对于基本数据类型是可以直接出重的，
     * 但是对于自定义类型，我们是需要重写hashCode和equals方法来移除重复元素。
     */
    private static void streamDistinct2() {
        Stream.of(new Person("张三", 18),
                        new Person("李四", 22),
                        new Person("王五", 25),
                        new Person("张三", 18))
                .distinct() // 去掉重复的数据
                .forEach(System.out::println);
    }

}
